/**
 * json字符串为数组 转换失败返回空数组
 */
export function str2Array<T>(url: T[] | string): T[] {
  if (Array.isArray(url)) {
    return url;
  } else {
    try {
      const list = JSON.parse(url);
      return Array.isArray(list) ? list : [];
    } catch (e) {
      return [];
    }
  }
}

/**
 * 数组对象去重 (根据某个字段去重)
 * @param arr - 需要去重的数组
 * @param key - 需要根据那个字段去重
 */
export function filterRepeat<T extends Record<string, unknown>, K extends keyof T>(arr: T[], key: K): T[] {
  const res = new Map<unknown, 1>();
  return arr.filter((item) => !res.has(item[key]) && res.set(item[key], 1));
}

/**
 * 根据两个数组和一个 key 筛选数组
 * @param arr - 需要去重的数组
 * @param key - 需要根据那个字段去重
 * @example filterByArrKey([{a:1},{a:2},{a:3}], [1,2], 'a')
 */
export function filterByArrKey<T extends Record<number | string, unknown>, K extends number | string, J extends keyof T>(arr: T[], keys: K[], key: J): T[] {
  const obj: Record<number | string, 1> = {};
  keys.forEach((item) => {
    obj[item] = 1;
  });
  return arr.filter((item) => {
    const keyValue = item[key] as number | string;
    return !obj[keyValue];
  });
}

/**
 * 将数组切成指定size的二维数组
 * @param arr - 原数组
 * @param size - 大小
 */
export function chunkArray(arr: any[], size: number) {
  const result = [];
  for (let i = 0; i < arr.length; i += size) {
    result.push(arr.slice(i, i + size));
  }
  return result;
}
